/**
 * Created by asus on 2017/4/27.
 */
import java.util.StringTokenizer;
import java.util.Stack;

import static jdk.nashorn.internal.objects.NativeArray.push;

public class MyDC {
    /** constant for addition symbol */
    private final String ADD = "+";
     /** constant for subtraction symbol */
            private final String  SUBTRACT = "-";
    /** constant for multiplication symbol */
       private final String MULTIPLY = "*";
   /** constant for division symbol */
            private final String DIVIDE = "/";
   /** the stack */
            private Stack<Integer> stack;

            public MyDC() {
             stack = new Stack<Integer>();
           }

           public int evaluate (String expr)
    {
            int op1, op2, result = 0;
            String token;
             StringTokenizer tokenizer = new StringTokenizer (expr);

             while (tokenizer.hasMoreTokens())
                 {
                   token = tokenizer.nextToken();

                   //如果是运算符，调用isOperator
                   if (isOperator(token))
                      {
                         int b = stack.pop();//从栈中弹出操作数2
                         int a = stack.pop();//从栈中弹出操作数1
                         result = evalSingleOp(token,a,b);//根据运算符和两个操作数调用evalSingleOp计算result;
                         stack.push(result);//计算result入栈;
                       }
                  else{
                       stack.push(Integer.parseInt(token));
                   }//如果是操作数
                     //操作数入栈;
                 }

             return result;
           }

           private boolean isOperator (String token)
    {
            return ( token.equals("+") || token.equals("-") ||
                              token.equals("*") || token.equals("/") );
          }

            private int evalSingleOp (String operation, int op1, int op2)
    {
             int result = 0;

             switch (operation)
             {
                   case ADD:
                         result = op1 + op2;
                        break;
                   case SUBTRACT:
                         result = op1 - op2;
                         break;
                  case MULTIPLY:
                         result = op1 * op2;
                         break;
                   case DIVIDE:
                        result = op1 / op2;
                     }

             return result;
           }
}
